<HTML>
<HEAD>
<!-- This HTML file has been created by texi2html 1.29
     from fw.tnf on 19 December 2010 -->

<TITLE>FunnelWeb - Producing Specifications</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" BACKGROUND="gifs/bg.gif">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0" VALIGN=BOTTOM>
<TR VALIGN=BOTTOM>
<TD WIDTH="160" VALIGN=BOTTOM>
<A HREF="http://eli-project.sourceforge.net/">
<IMG SRC="gifs/elilogo.gif" BORDER=0>
</A>&nbsp;
</TD>
<TD WIDTH="25" VALIGN=BOTTOM>
<img src="gifs/empty.gif" WIDTH=25 HEIGHT=25>
</TD>
<TD ALIGN=LEFT WIDTH="475" VALIGN=BOTTOM>
<A HREF="index.html"><IMG SRC="gifs/title.png" BORDER=0></A>
</TD>
<!-- |DELETE FOR SOURCEFORGE LOGO|
<TD>
<a href="http://sourceforge.net/projects/eli-project">
<img
  src="http://sflogo.sourceforge.net/sflogo.php?group_id=70447&amp;type=13"
  width="120" height="30"
  alt="Get Eli: Translator Construction Made Easy at SourceForge.net.
    Fast, secure and Free Open Source software downloads"/>
</a>
</TD>
|DELETE FOR SOURCEFORGE LOGO| -->
</TR>
</TABLE>

<HR size=1 noshade width=785 align=left>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=0>
<TR>
<TD VALIGN=TOP WIDTH="160">
<h4>General Information</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="index.html">Eli: Translator Construction Made Easy</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gindex_1.html#SEC1">Global Index</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="faq_toc.html" >Frequently Asked Questions</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Tutorials</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="EliRefCard_toc.html">Quick Reference Card</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="novice_toc.html">Guide For new Eli Users</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="news_toc.html">Release Notes of Eli</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="nametutorial_toc.html">Tutorial on Name Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="typetutorial_toc.html">Tutorial on Type Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Reference Manuals</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ui_toc.html">User Interface</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="pp_toc.html">Eli products and parameters</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lidoref_toc.html">LIDO Reference Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Libraries</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lib_toc.html">Eli library routines</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="modlib_toc.html">Specification Module Library</a></td></tr>
</table>

<h4>Translation Tasks</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lex_toc.html">Lexical analysis specification</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="syntax_toc.html">Syntactic Analysis Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="comptrees_toc.html">Computation in Trees</a></td></tr>
</table>

<h4>Tools</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lcl_toc.html">LIGA Control Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="show_toc.html">Debugging Information for LIDO</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gorto_toc.html">Graphical ORder TOol</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="fw_toc.html">FunnelWeb User's Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ptg_toc.html">Pattern-based Text Generator</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="deftbl_toc.html">Property Definition Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="oil_toc.html">Operator Identification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="tp_toc.html">Tree Grammar Specification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="clp_toc.html">Command Line Processing</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="cola_toc.html">COLA Options Reference Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="idem_toc.html">Generating Unparsing Code</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="mon_toc.html">Monitoring a Processor's Execution</a> </td></tr>
</table>

<h4>Administration</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="sysadmin_toc.html">System Administration Guide</a> </td></tr>
</table>

<HR WIDTH="100%">
<A HREF="mailto:eli-project-users@lists.sourceforge.net">
<IMG SRC="gifs/button_mail.gif" BORDER=0 ALIGN="left"></A>
<A HREF="index.html"><IMG SRC="gifs/home.gif" BORDER=0 ALIGN="right"></A>

</TD>
<TD VALIGN=TOP WIDTH="25"><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>

<TD VALIGN=TOP WIDTH="600">
<H1>FunnelWeb</H1>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="fw_1.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="fw_3.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="fw_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
<H1><A NAME="SEC2" HREF="fw_toc.html#SEC2">Producing Specifications</A></H1>
<P>
<H2><A NAME="SEC3" HREF="fw_toc.html#SEC3">Output Files</A></H2>
<P>
<PRE>
<VAR>outputfile</VAR> ::= (<SAMP>`@N'</SAMP> | <SAMP>`@O'</SAMP>) <VAR>filename</VAR> [<SAMP>`=='</SAMP>] <SAMP>`@{'</SAMP> <VAR>expression</VAR> <SAMP>`@}'</SAMP> .
</PRE>
<P>
When processing to obtain the specification, these directives create an
<A NAME="IDX20"></A>
<A NAME="IDX19"></A>
output file named <DFN>filename</DFN> that contains an 
<DFN>expression</DFN> consisting of text and calls to macros (defined
later). Filenames must be unique within a FunnelWeb-file.
<P>
The <SAMP>`=='</SAMP>-part is optional an can be left out. It is included to
pair the same option for macros.
<P>
When processing to obtain the documentation, the <VAR>expression</VAR> is
printed using the <CODE>tt font</CODE>. Above, the filename is set and below a
note is included that this code is attached to an output file.
<P>
The difference between <SAMP>`@N'</SAMP> and <SAMP>`@O'</SAMP> lies in the way in which
the files are treated by Eli.
A file extracted by <SAMP>`@O'</SAMP> becomes part of the specification described
by the FunnelWeb file, while a file extracted by <SAMP>`@N'</SAMP> does not.
<A NAME="IDX22"></A>
<A NAME="IDX21"></A>
Most files should be extracted by <SAMP>`@O'</SAMP>; <DFN>non-product files</DFN>,
extracted by <SAMP>`@N'</SAMP>, are those that are used in the derivation of
product components, but are not themselves components of the product.
<P>
As an example of the use of a non-product file, consider the problem of
making keywords case-insensitive but retaining case sensitivity in
identifiers
(see  <A HREF="lex_5.html#SEC25">Making Literal Symbols Case Insensitive of Lexical Analysis</A>).
Here is a portion of a FunnelWeb file implementing such a processor:
<P>
<PRE>
@O@&#60;nolit.gla@&#62;==@{
identifier: C_IDENTIFIER
@}

@N@&#60;keyword.gla@&#62;==@{
$[a-z]+
@}

@O@&#60;keyword.specs@&#62;==@{
keyword.gla :kwd
@}
</PRE>
<P>
Note that the file <TT>`keyword.gla'</TT> can <EM>not</EM> form part of the final
product specification.
If it did, the specified processor would treat all completely lower case
identifiers as comments!
Nevertheless, file <TT>`keyword.gla'</TT> is necessary to specify the
representation of the keywords in the <EM>grammar</EM> so that they can be
extracted and processed separately
(see  <A HREF="lex_5.html#SEC25">Making Literal Symbols Case Insensitive of Lexical Analysis</A>).
Thus file <TT>`keyword.gla'</TT> is extracted by <SAMP>`@N'</SAMP>, while the other
files are extracted by <SAMP>`@O'</SAMP>.
<P>
<H2><A NAME="SEC4" HREF="fw_toc.html#SEC4">Extracting Output Files with Eli</A></H2>
<P>
Within Eli, the derivation <CODE>:fwGen</CODE> can be used to obtain a
directory that contains all the output files contained in a FunnelWeb
specification. With the sample specification from the Introduction, you
can run following Eli-derivations:
<P>
<DL COMPACT>
<DT><CODE>first.fw :fwGen !ls</CODE>
<DD>This generates a directory containing all the output files (only
<TT>`helloworld.lido'</TT> in this case) and runs the command <CODE>ls</CODE> with
its name.
<P>
<DT><CODE>first.fw :fwGen/helloworld.lido&#62;</CODE>
<DD>This generates a directory containing all the output files from
<TT>`first.fw'</TT>. It then selects the file <TT>`helloworld.lido'</TT> and
copies its contents to the standard output.
</DL>
<P>
<H2><A NAME="SEC5" HREF="fw_toc.html#SEC5">Macros</A></H2>
<P>
A macro definition
binds a unique <DFN>macro name</DFN> to a <DFN>macro body</DFN> containing an
<DFN>expression</DFN> consisting of text, calls to other macros, and formal
parameters.  The syntax for a macro definition is as follows:
<P>
<PRE>
<VAR>macro</VAR> ::= <SAMP>`@$'</SAMP> <VAR>name</VAR> [<VAR>formal_parameter_list</VAR>] 
                [<SAMP>`@Z'</SAMP>] [<SAMP>`@M'</SAMP>] [<SAMP>`=='</SAMP> / <SAMP>`+='</SAMP>] <SAMP>`@{'</SAMP> <VAR>expression</VAR> <SAMP>`@}'</SAMP> .
</PRE>
<A NAME="IDX23"></A>
<P>
The complexity of the macro definition syntax is mostly to enable the
user to attach various attributes to the macro.
<P>
By default, a macro must be invoked exactly once by one other
<A NAME="IDX24"></A>
macro or by an output file command. However, if the user uses the <CODE>@Z</CODE>
sequence in the macro definition, the macro is then permitted to be
invoked zero times, as well as once.  Similarly, if the user uses the
<A NAME="IDX25"></A>
<CODE>@M</CODE> sequence in the macro definition, the macro is permitted to be called
many times as well as once.  If both <CODE>@Z</CODE> and <CODE>@M</CODE> are
present then the macro is permitted to be invoked zero, one, or many
times.
<P>
The purpose of enforcing the default "exactly one call" rule is to
flag pieces of code that the user may have defined in a macro but not
hooked into the rest of the program.  Experience shows that this is a
common error.  Similarly, it can be dangerous to multiply invoke a macro
intended to be invoked only once.  For example, it may be dangerous to
invoke a scrap of non-idempotent initialization code in two different
parts of the main function of a program!
<P>
If the text string <CODE>==</CODE>
<A NAME="IDX26"></A>
(or nothing) follows the macro name, the expression that follows is the
entire text of the macro body.  If the text string <CODE>+=</CODE>
<A NAME="IDX27"></A>
follows the macro name, then more than one such definition is allowed
(but not required) in the document and the body of the macro consists of
the concatenation of all such expressions in the order in which they
occur in the input file.  Such a macro is said to be additive and is
<DFN>additively defined</DFN>.  Thus a macro body can either be defined in one
place using one definition (using <CODE>==</CODE>) or it can be
<EM>distributed</EM> throughout the input file in a sequence of one or
more macro definitions (using <CODE>+=</CODE>).  If neither <CODE>==</CODE> and
<CODE>+=</CODE> are present, FunnelWeb assumes a default of <CODE>==</CODE>.
<P>
Additively defined macros can have parameter lists and <CODE>@Z</CODE> and
<CODE>@M</CODE> attributes, but these must be specified only in the first
definition of the macro.  However, <CODE>+=</CODE> must appear in each
definition.
<P>
<A NAME="IDX28"></A>
<A NAME="IDX29"></A>
<A NAME="IDX30"></A>
<H3><A NAME="SEC6" HREF="fw_toc.html#SEC6">Names</A></H3>
<P>
Names are used to identify macros and sections.  A name consists of a
sequence of from zero to 80 printable characters, including the blank
character.  End of line characters are not permitted in names.  Names are
case sensitive; two different macros are permitted to have names that
differ in case only.  Like free text, names are typeset by FunnelWeb and
are safe from misinterpretation by the target typesetter.  For example,
it is quite acceptable to use the macro name <CODE>@&#60;\medskip@&#62;</CODE>
even if the target typesetter is TeX.
<P>
<PRE>
<VAR>name</VAR> ::= <SAMP>`@&#60;'</SAMP> <VAR>name_text</VAR> <SAMP>`@&#62;'</SAMP> .

<VAR>name_text</VAR> ::= {<VAR>ordinary_char</VAR> / <VAR>text_special</VAR>} .

</PRE>
<P>
<A NAME="IDX31"></A>
<H3><A NAME="SEC7" HREF="fw_toc.html#SEC7">Formal Parameter Lists</A></H3>
<P>
FunnelWeb allows macros to have up to nine macro parameters, named
<CODE>@1</CODE>,
<A NAME="IDX32"></A>
<CODE>@2</CODE>,..., <CODE>@9</CODE>.  If a macro does not have a formal parameter
list, it is defined to have no parameters, and an actual parameter list
must not appear at the point of call.  If a macro has a formal parameter
list, it is defined to have one or more parameters, and a corresponding
actual parameter must be supplied for each formal parameter, at the
point of call.
<P>
Because FunnelWeb parameters have predictable names, the only
information that a formal parameter list need convey is <EM>how many</EM>
parameters a macro has.  For this reason a formal parameter list takes
the form of the highest numbered formal parameter desired, enclosed in
parentheses sequences.
<P>
<PRE>
<VAR>formal_parameter_list</VAR> ::= <SAMP>`@('</SAMP> <VAR>formal_parameter</VAR> <SAMP>`@)'</SAMP> .

<VAR>formal_parameter</VAR> ::= <SAMP>`@1'</SAMP> / <SAMP>`@2'</SAMP> / <SAMP>`@3'</SAMP> / <SAMP>`@4'</SAMP> / <SAMP>`@5'</SAMP> /
                            <SAMP>`@6'</SAMP> / <SAMP>`@7'</SAMP> / <SAMP>`@8'</SAMP> / <SAMP>`@9'</SAMP> .
</PRE>
<P>
<H2><A NAME="SEC8" HREF="fw_toc.html#SEC8">Macro Calls</A></H2>
<P>
A macro call consists of a name optionally followed by an actual
parameter list.  The number of parameters in the actual parameter list
must be the same as the number of formal parameters specified in the
definition of the macro.  If the macro has no formal parameter list, its
call must have no actual parameter list.
<P>
<PRE>
<VAR>macro_call</VAR> ::= <VAR>name</VAR> [<VAR>actual_parameter_list</VAR>] .

<VAR>actual_parameter_list</VAR> ::= <SAMP>`@('</SAMP> <VAR>actpar</VAR> { <SAMP>`@,'</SAMP> <VAR>actpar</VAR> } <SAMP>`@)'</SAMP> .

<VAR>actpar</VAR> ::= <VAR>expression</VAR> /
                            ( <VAR>whitespace</VAR> <SAMP>`@"'</SAMP> <VAR>expression</VAR> <SAMP>`@"'</SAMP> <VAR>whitespace</VAR> ) .

<VAR>whitespace</VAR> ::= {<SAMP>` '</SAMP> / <VAR>eol</VAR>} .
</PRE>
<P>
FunnelWeb allows parameters to be passed directly, or delimited by
special double quotes.
<A NAME="IDX33"></A>
Each form is useful under different circumstances.  Direct specification
is useful where the parameters are short and can be all placed on one
line.  Double quoted parameters allow whitespace on either side (that is
not considered part of the parameter) and are useful for laying out
rather messy parameters.  Here are examples of the two forms.
<P>
<PRE>
@&#60;Generic Loop@&#62;@(
   @"x:=1;@"  @,
   @"x&#60;=10;@" @,
   @"print "x=%u, x^2=%u",x,x*x;
   x:=x+1;@+@"
@)

@&#60;Colours@&#62;@(red@,green@,blue@,yellow@)
</PRE>
<P>
As shown, the two forms may be mixed within the same parameter list.
<P>
Formal parameters can appear in the expressions forming macro bodies in
accordance with the syntax rules defined above.  A formal parameter
expands to the text of the expansion of its corresponding actual
parameter.  There is nothing preventing a formal parameter being provided
as part of an expression that forms an actual parameter.  In that
happens, the formal parameter is bound to the actual parameter of the
calling macro, not the called macro.  After the following definitions,
<P>
<PRE>
@$@&#60;One@&#62;@(@1@)=@{A walrus in @1 is a walrus in vain.@}
@$@&#60;Two@&#62;@(@1@)=@{@&#60;One@&#62;@(S@1n@)@}
</PRE>
the call
<P>
<PRE>
@&#60;Two@&#62;@(pai@)
</PRE>
will result in the expansion
<P>
<PRE>
A walrus in Spain is a walrus in vain.
</PRE>
<P>
<H2><A NAME="SEC9" HREF="fw_toc.html#SEC9">Controlling Macro Expansion</A></H2>
<P>
<H3><A NAME="SEC10" HREF="fw_toc.html#SEC10">Indentation</A></H3>
<A NAME="IDX34"></A>
<P>
When FunnelWeb expands a macro, it can do so in two ways.  First it can
treat the text it is processing as a one-dimensional stream of text, and
merely insert the body of the macro in place of the macro call.  Second,
it can treat the text of the macro as a two dimensional object and
indent each line of the macro body by the amount that the macro call
itself was indented.  Consider the following macros.
<P>
<PRE>
@$@&#60;Loop Structure@&#62;@{@-
i=1;
while (i&#60;=N)
   @&#60;Loop body@&#62;
endwhile
@}

@$@&#60;Loop body@&#62;@{@-
a[i]:=0;
i:=i+1;@}
</PRE>
<P>
Under the regime of <DFN>no indentation</DFN>
<A NAME="IDX35"></A>
the loop structure macro expands to:
<P>
<PRE>
i=1;
while (i&#60;=N)
   a[i]:=0;
i:=i+1;
endwhile
</PRE>
<P>
Under the regime of <DFN>blank indentation</DFN>
<A NAME="IDX36"></A>
the loop structure macro expands to:
<P>
<PRE>
i=1;
while (i&#60;=N)
   a[i]:=0;
   i:=i+1;
endwhile
</PRE>
<P>
The <CODE>indentation</CODE> pragma determines which of these two regimes will
be used to expand the macros when constructing the product files.  The
syntax of the pragma is:
<P>
<PRE>
<VAR>pragma_indent</VAR> ::= <VAR>ps</VAR> <SAMP>`indentation'</SAMP> <VAR>s</VAR> <SAMP>`='</SAMP> <VAR>s</VAR> (<SAMP>`blank'</SAMP> / <SAMP>`none'</SAMP>) .

<VAR>s</VAR> ::= {<SAMP>` '</SAMP>}+ .

<VAR>ps</VAR> ::= (<SAMP>`@p'</SAMP> / <SAMP>`@P'</SAMP>) <SAMP>` '</SAMP> .
</PRE>
<P>
Its two forms look like this:
<P>
<PRE>
@p indentation = blank
@p indentation = none
</PRE>
<P>
In the current version of FunnelWeb, the indentation regime is an
attribute that is attached to an entire run of Tangle; it is not
possible to bind it to particular product files or to particular macros.
As a result, it doesn't matter where indentation pragmas occur in the
input file or how many there are so long as they are all the same.  By
default FunnelWeb uses blank indentation.
<P>
<H3><A NAME="SEC11" HREF="fw_toc.html#SEC11">Output Length</A></H3>
<A NAME="IDX37"></A>
<A NAME="IDX38"></A>
<A NAME="IDX39"></A>
<A NAME="IDX40"></A>
<P>
FunnelWeb also keeps an
eye on the line lengths of product files and flags all lines longer than
a certain limit with error messages.  Unlike the maximum input line
length, which can vary dynamically throughout the input file, the
maximum product file line length remains fixed throughout the generation
of all the product files.  The maximum product file line length pragma
allows this value to be set.  If there is more than one such pragma in an
input file, the pragmas must all specify the same value.
<P>
<PRE>
<VAR>pragma_moll</VAR> ::= <VAR>ps</VAR> <SAMP>`maximum_output_line_length'</SAMP> <VAR>s</VAR> <SAMP>`='</SAMP> <VAR>s</VAR> <VAR>numorinf</VAR> .

<VAR>s</VAR> ::= {<SAMP>` '</SAMP>}+ .

<VAR>ps</VAR> ::= (<SAMP>`@p'</SAMP> / <SAMP>`@P'</SAMP>) <SAMP>` '</SAMP> .

<VAR>number</VAR> ::= { <VAR>decimal_digit</VAR> }+ .

<VAR>numorinf</VAR> ::= <VAR>number</VAR> / <SAMP>`infinity'</SAMP> .
</PRE>
<P>
The default value is 80 characters.
<P>
<HR size=1 noshade width=600 align=left>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="fw_1.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="fw_3.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="fw_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
</TD>
</TR>
</TABLE>

</BODY></HTML>
